package DesignMode.Singleton;

/**
 * 注意：
 *
 * volatile意为： 不稳定
 * 计算机   主存  高速缓存  cpu        有volatile修饰的会立即刷新到主存中
 *
 * https://www.cnblogs.com/dolphin0520/p/3920373.html
 *
 * volatile的使用，为了防止暴露一个未初始化的不完整单例实例；
 * 双重判空校验，第一个判断避免了频繁的加锁，第二个判断可以拦住多余的创建实例的线程；
 * 加锁，保证了线程安全（只有一个实例）
 *
 * 这种实现方式是经常出现在面试题中的，而且经常会要求手写。
 *
 * 这种最常用
 */
public class Singleton6 {
    public static volatile Singleton6 singleton6;   //如果不加 volatile
                                                    // 第28行(JVM层面会分为3步)会被重排序，不安全(B会加载到未初始化的 singleton6)
    private Singleton6() {}

    public static Singleton6 getSingleton6() {
        if(singleton6 == null) {
            synchronized (Singleton6.class) {
                if(singleton6 == null) {
                    return new Singleton6();
                }
            }
        }
        return singleton6;

    }}
